package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"ms-produce/service"
	"time"
)

// GetUser 实现请求服务的具体方法
func GetUser(client service.ProdServiceClient, req *service.ProductRequest) (*service.ProductResponse, error) {
	return client.GetProductStock(context.Background(), req)
}

func main() {
	// 1 启用监听
	conns, err := grpc.Dial(
		":3008",
		grpc.WithTransportCredentials(insecure.NewCredentials()),
	)

	if err != nil {
		fmt.Println("错误", err)
		return
	}
	fmt.Println("监听", conns)
	// 程序结束的时候关闭监听
	defer func(conns *grpc.ClientConn) {
		err := conns.Close()
		if err != nil {
			fmt.Println(err)
		}
	}(conns)
	// 2 启用客户端服务
	client := service.NewProdServiceClient(conns)

	// 处理普通的请求
	fmt.Println("处理普通的请求 ------- start")

	result, err := GetUser(client, &service.ProductRequest{
		ProdId: 3,
	})
	if err != nil {
		fmt.Println("err", err)
		return
	}
	fmt.Println("显示请求返回来的信息", result)
	fmt.Println("处理普通的请求 ------- end")

	// 处理客户端流请求 --

	fmt.Println("处理客户端流请求 ------- start")
	stream, err := client.UpdateProductStockClientStream(context.Background())
	if err != nil {
		fmt.Println("接收流报错", err)
		return
	}
	// 拿到流以后可以不断的发送数据
	rsp := make(chan struct{}, 1)
	go prodRequest(stream, rsp)
	// 发送完以后进行接收
	select {
	case <-rsp:
		recv, err := stream.CloseAndRecv()
		if err != nil {
			fmt.Println("错误", err)
			return
		}
		fmt.Println("接收完成----", recv)
		stock := recv.ProdStock
		fmt.Println("客户端收到的信息", stock)
	}
	fmt.Println("处理客户端流请求 ------- end")

	// 处理服务端流请求
	//fmt.Println("处理服务端流请求 ------- start")
	//request := &service.ProductRequest{
	//	ProdId: 678,
	//}
	//stream, err := client.GetProductStockServerStream(context.Background(), request)
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//// 这里拿到了流,然后源源不断的从服务端接收
	//for {
	//	recv, err := stream.Recv()
	//	if err != nil {
	//		if err == io.EOF {
	//			fmt.Println("数据接收完成")
	//			err := stream.CloseSend()
	//			if err != nil {
	//				fmt.Println(err)
	//				return
	//			}
	//			break
	//		}
	//		fmt.Println(err)
	//		return
	//	}
	//	fmt.Println("客户端收到的流", recv.ProdStock)
	//}
	//fmt.Println("处理服务端流请求 ------- end")

	// 处理
	//fmt.Println("处理双向流请求 ---------- start")
	//stream, err := client.SayHelloStream(context.Background())
	//if err != nil {
	//	return
	//}
	//for {
	//	fmt.Println("客户端给服务端发消息--- start")
	//	request := &service.ProductRequest{
	//		ProdId: 789,
	//	}
	//	err = stream.Send(request)
	//	if err != nil {
	//		fmt.Println(err)
	//		return
	//	}
	//	fmt.Println("客户端给服务端发消息--- end")
	//	time.Sleep(time.Second)
	//	fmt.Println("客户端接收服务端发来的消息 -- start")
	//
	//	recv, err := stream.Recv()
	//	if err != nil {
	//		fmt.Println(err)
	//		return
	//	}
	//	fmt.Println("客户端收到服务端的消息", recv.ProdStock)
	//	fmt.Println("客户端接收服务端发来的消息 -- end")
	//}
	//fmt.Println("处理双向流请求 ---------- end")

}

func prodRequest(stream service.ProdService_UpdateProductStockClientStreamClient, rsp chan struct{}) {
	count := 0
	for {
		request := &service.ProductRequest{
			ProdId: 123,
		}
		err := stream.Send(request)
		if err != nil {
			fmt.Println(err)
			return
		}
		// 这里发送的时候加时间间隔
		time.Sleep(time.Second)
		count++
		if count > 10 {
			rsp <- struct{}{}
			break
		}
	}
}
